home *** CD-ROM | disk | FTP | other *** search
/ PC Media 23 / PC MEDIA CD23.iso / share / prog / anubis / bmp.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-04  |  2.6 KB  |  124 lines

  1. // BMP.H (C) Anubis Software Abril 1994.
  2. // Esta libreria sirve para poner un BMP de cualquier longitud en la pantalla
  3. // No se guarda BMP en memória, y además realiza todas las transacciones desde
  4. // el disco, lo cual puede enlentecer todo el mecanismo.
  5. //
  6.  
  7. #ifndef BMP.H
  8. #define BMP.H
  9.  
  10. #include <graficos.h>
  11. #include <dos.h>
  12. #include <stdio.h>
  13.  
  14. #ifndef __SGRAPH
  15. #define putpixel putpunto
  16. #endif
  17.  
  18. #ifndef BMPOBJ.H
  19.  
  20. #ifndef BYTE_WORD_DWORD
  21. typedef unsigned char BYTE;
  22. typedef unsigned int WORD;
  23. typedef unsigned long DWORD;
  24. #endif
  25.  
  26. typedef struct tagBITMAPFILEHEADER {
  27.     WORD        bfType;
  28.     DWORD        bfSize;
  29.     WORD        bfReserved1;
  30.     WORD        bfReserved2;
  31.     DWORD        bfOffBits;
  32. } BITMAPFILEHEADER;
  33.  
  34. typedef struct {
  35.     DWORD        biSize;
  36.     DWORD        biWidth;
  37.     DWORD        biHeight;
  38.     WORD        biPlanes;
  39.     WORD        biBitCount;
  40.  
  41.     DWORD        biCompression;
  42.     DWORD        biSizeImage;
  43.     DWORD        biXPelsPerMeter;
  44.     DWORD        biYPelsPerMeter;
  45.     DWORD        biClrUSED;
  46.     DWORD        biClrImportant;
  47. } W_BITMAPINFOHEADER;
  48.  
  49. typedef unsigned char BYTE;
  50.  
  51. typedef struct tagRGBQUAD {
  52.     BYTE        rgbBlue;
  53.     BYTE        rgbGreen;
  54.     BYTE        rgbRed;
  55.     BYTE        rgbReserved;
  56. } RGBQUAD;
  57. #endif
  58. void cargar_bmp(char *fichero)
  59. {
  60.     // Estas son mis variables.
  61.     BITMAPFILEHEADER         fheader;
  62.     W_BITMAPINFOHEADER    fiheader;
  63.     RGBQUAD Paleta[256];
  64.     FILE *handle; // ESte es el buffer del fichero;
  65.     unsigned long Pixels;
  66.     unsigned short int x=0,y=480;
  67.     char p1,p2,p3,p4;
  68.     int rojo[16];
  69.     int verde[16];
  70.     int azul[16];
  71.  
  72.     // ESTE ES EL APARTADO CORRESPONDIENTE A MI PROGRAMA.
  73.     vga640x480();
  74.  
  75.     parar_pantalla();
  76.     if ((handle = fopen(fichero,"rb")) == NULL)
  77.     {
  78.         perror("Error:");
  79.         exit(1);
  80.     }
  81.     fread(&fheader,sizeof(BITMAPFILEHEADER),1,handle);
  82.     fread(&fiheader,sizeof(W_BITMAPINFOHEADER),1,handle);
  83.     for(int i=0;i<16;i++)
  84.         fread(&Paleta[i],sizeof(RGBQUAD),1,handle);
  85.  
  86.     for (i=0;i<16;i++)
  87.     {
  88.         rojo[i]=Paleta[i].rgbRed >> 2;
  89.         verde[i]=Paleta[i].rgbGreen >> 2;
  90.         azul[i]=Paleta[i].rgbBlue >> 2;
  91.     }
  92.  
  93.     paleta16(rojo,verde,azul);
  94. #ifndef __SGRAPH
  95.     modo_puntos();
  96. #endif
  97.  
  98.     while (fread(&Pixels,4,1,handle) != NULL)
  99.     {
  100.         p1 =( (Pixels & 0xFF000000) >> 24);
  101.         p2 =( (Pixels & 0x00FF0000) >> 16);
  102.         p3 =( (Pixels & 0x0000FF00) >> 8);
  103.         p4 = Pixels & 0x000000FF;
  104.         putpixel(x++,y,(p4 & 0xF0) >> 4);
  105.         putpixel(x++,y,(p4 & 0x0F));
  106.         putpixel(x++,y,(p3 & 0xF0) >> 4);
  107.         putpixel(x++,y,(p3 & 0x0F));
  108.         putpixel(x++,y,(p2 & 0xF0) >> 4);
  109.         putpixel(x++,y,(p2 & 0x0F));
  110.         putpixel(x++,y,(p1 & 0xF0) >> 4);
  111.         putpixel(x++,y,(p1 & 0x0F));
  112.         if (x>=fiheader.biWidth)
  113.         {
  114.             x = 0;
  115.             y--;
  116.         }
  117.     }
  118. #ifndef __SGRAPH
  119.     modo_planos();
  120. #endif
  121.     activar_pantalla();
  122.     fclose(handle);
  123. }
  124. #endif